package br.unisul.redeNeural;

import java.util.ArrayList;
import java.util.List;


/**
 * Classe para representar os valores de entradas e saidas de uma {@link RedeNeural}
 * @author Joelson Fernandes
 * @version 1.0
 */
public class ParTreino implements java.io.Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -3334236986919067466L;
	
	/**
	 * Valores de entrada da rede neural
	 */
	private List<double[]> entradas;
	/**
	 * Valores de saida de uma rede neural
	 */
	private List<double[]> saidas;
	/**
	 * Configurações da rede neural
	 */
	private Configuracao configuracao;

	

	/**
	 * Inicializa o {@link ParTreino} com as mesmas configurações da {@link RedeNeural}
	 * @param configuracao - configurações da rede neural
	 */
	public ParTreino(Configuracao configuracao) {
		super();
		this.configuracao = configuracao;
		entradas = new ArrayList<double[]>();
		saidas = new ArrayList<double[]>();
	}
	
	/**
	 * Metodo para verificas se as entradas e saidas são validas conforme as configura��es
	 * @param entradas - entradas da rede neural
	 * @param saidas - saidas de rede neural
	 * @param configuracao - configurações da rede neural
	 * @return <code>true</code> caso o tamanho da entrada e da saida seja compativel com os valores descrito na configura��o
	 */
	private boolean isValido(double []entradas, double []saidas){
		return (entradas.length == configuracao.getQuantidadeEntrada()) && (saidas.length == configuracao.getQuantidadeSaida());
	}

	/**
	 * Metodo para adicionar um par de treino.
	 * @param entrada - valores do neuronio de entrada
	 * @param saida - valores do neuronio de saida
	 * @return <code>true</code> se os dados serem adicionados
	 */
	public boolean adicionaPar(double []entrada, double []saida){
		boolean add = isValido(entrada, saida);
		if(add){
			add &= entradas.add(entrada);
			add &= saidas.add(saida);
		}
		return add;
	}
	
	/**
	 * Metodo para remover um par de treino
	 * @param entrada valores do neuronio de Entrada
	 * @param saida valores do neuronio de saida
	 * @return <code>true</code> ser for removido
	 */
	public boolean removerPar(double []entrada, double []saida){
		boolean add = isValido(entrada, saida);
		if(add){
			add &= entradas.remove(entrada);
			add &= saidas.remove(saida);
		}
		return add;
	}
	
	/**
	 * Retorna a quantidade de pares cadastradas
	 * @return quantidade de pares cadastradas
	 */
	public int getQuantidade(){
		return entradas.size();
	}

	/**
	 * Retorna a entrada referente ao indice
	 * @param indice - indice da entrada
	 * @return entrada referente ao indice
	 */
	public double[] getEntrada(int indice){
		return entradas.get(indice);
	}
	
	/**
	 * Retorna a saida referente ao indice
	 * @param indice - indice da saida
	 * @return saida referente ao indice
	 */
	public double[] getSaida(int indice){
		return saidas.get(indice);
	}

	/**
	 * @return the entradas
	 */
	public List<double[]> getEntradas() {
		return entradas;
	}

	/**
	 * @param entradas the entradas to set
	 */
	public void setEntradas(List<double[]> entradas) {
		this.entradas = entradas;
	}

	/**
	 * @return the saidas
	 */
	public List<double[]> getSaidas() {
		return saidas;
	}

	/**
	 * @param saidas the saidas to set
	 */
	public void setSaidas(List<double[]> saidas) {
		this.saidas = saidas;
	}

	/**
	 * @return the configuracao
	 */
	public Configuracao getConfiguracao() {
		return configuracao;
	}


	
	
}